/**
 * 
 */
Ext.define("wufe.util.map.MapClass", {
	mixins:['wufe.util.map.MapMeasureTool'],
	config : {
		defaultFormat : 'image/png',
		wms_url : null,
		wms_url_getFeature : null,
		map_divid : null,
		map : null,
		currentClientPoint : null,
		currentClientMapPoint : null,
		m_CurrentTool : null,
		ProxyHost : null,
		defaultFormat : null,
		defaultProjection : null,
		defaultBounds : null,
		vlayer_drawFeature : null,
		layer_Highlight : null,
		LayerList : null,
		// 自定义的wms图层属性
		map_Raster : null,
		map_Cadastra : null,
		//
		// 图层名称
		layer_DOM : "RFS_DOM", // DOM层名;
		layer_XZQ : "RFS_XZQ", // 行政区层名
		layer_DX : "RFS_MZDW", // 其他地类层名
		layer_ZD : "RFS_CBD_ZD", // 宗地层名
		// 新添加图层
		layer_ZD_LS : "RFS_CBD_LS"// 历史图层名称
	},

	constructor : function(config) {
		this.initConfig(config);
		OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
		OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
	/*	OpenLayers.INCHES_PER_UNIT["千米"] = OpenLayers.INCHES_PER_UNIT["km"];
		OpenLayers.INCHES_PER_UNIT["米"] = OpenLayers.INCHES_PER_UNIT["m"];
		OpenLayers.INCHES_PER_UNIT["英里"] = OpenLayers.INCHES_PER_UNIT["mi"];
		OpenLayers.INCHES_PER_UNIT["英寸"] = OpenLayers.INCHES_PER_UNIT["ft"];*/
		this.defaultFormat = 'image/png';
		//
		this.map = null;
	},
	// 初始化地图方法
	init : function(map, mapWrap) {
		OpenLayers.ProxyHost = this.ProxyHost;
		// 默认参数
		this.defaultProjection = "EPSG:4326";
		this.defaultBounds = new OpenLayers.Bounds(-180.0, -90.20209041233414,
				180.4041808246683, 90.0);
		var bounds = this.defaultBounds;
		// 选项
		var options = {
			controls : [], // 若添加编辑框就在[]中加上 new
			// OpenLayers.Control.EditingToolbar(vlayer)
			maxExtent : bounds,
			maxResolution : 35.154296875,
			projection : this.defaultProjection,
			units : 'm',
			allOverlays : false
			// true代表允许叠加显示图层
		};
		// 初始化地图对象
		this.map = new OpenLayers.Map(this.map_divid, options);
		map = this.map; // 给全局变量map赋值
		mapWrap = this; // 给全局变量赋值
		var t_LLPoint = new OpenLayers.LonLat(0, 0);
	},
	setCenterPoint : function(openLayerLonLatPoint, Level) {
		if (this.map != null) {
			this.map.setCenter(openLayerLonLatPoint, Level);
		}
	},
	// 创建wms图层
	createLayerWms : function(p_mapName, p_wms_url, p_layers) {
		var t_mapLayer = new OpenLayers.Layer.WMS(p_mapName, p_wms_url, {
					layers : p_layers,
					styles : '',
					tiled : true,
					srs : this.defaultProjection,
					format : this.defaultFormat
				}, {
					singleTile : true,
					ratio : 1
				});
		return t_mapLayer;
	},
	// 创建TMS图层
	createLayerTMS : function(layerName, options) {
		if (Ext.isEmpty(options)) 
			options= {getURL : this.getImg};
		else
			Ext.applyIf(options,{getURL : this.getImg});

		return  new OpenLayers.Layer.TMS(layerName, "", options);
	},
	// 创建Vector图层
	createLayerVector : function(p_LayerName) {
		var t_layer_vector = new OpenLayers.Layer.Vector(p_LayerName);
		return t_layer_vector;
	},
	// 创建查询图层
	createLayerQuery : function(p_QueryLayerName) {
		var t_querylayerName = '查询图层';
		if (!Ext.isEmpty(p_QueryLayerName)) {
			t_querylayerName = p_QueryLayerName;
		}
		var t_styleMap = new OpenLayers.StyleMap({
					"default" : {
						strokeColor : "#FF0000",
						strokeOpacity : 1,
						fillColor : "#6699ff",
						fillOpacity : 0.2
					}
				});
		var t_layer_Query = new OpenLayers.Layer.Vector(t_querylayerName,
				t_styleMap);
		return t_layer_Query;
	},
	// 添加图层
	addLayer : function(pLayer) {
		if (this.map != null) {
			this.map.addLayers([pLayer]);
		}
	},
	// 添加图层集
	addLayers : function(pLayers) {
		if (this.map != null) {
			this.map.addLayers([pLayers]);
		}
	},
	// 添加地图系统常用工具控件
	// 添加系统命令 控件 OK
	addSystemCommands : function() {
		// this.map.addControl(new OpenLayers.Control.LayerSwitcher());
		// 添加比例尺线
		var t_scaleline = new OpenLayers.Control.ScaleLine({
					topOutUnits : "千米",
					topInUnits : "米",
					bottomOutUnits : "英里",
					bottomInUnits : "英寸"
				});
		t_scaleline.setMap(this.map);
		this.map.addControl(t_scaleline);
		// 添加比例尺
		var t_scale = new OpenLayers.Control.Scale();
		t_scale.setMap(this.map);
		this.map.addControl(t_scale);
		// 添加鼠标点
		var t_mouseposition = new OpenLayers.Control.MousePosition();
		t_mouseposition.setMap(this.map);
		this.map.addControl(t_mouseposition);
		// 添加鹰眼图
		// var t_ovmap = new OpenLayers.Control.LTOverviewMap();
		// t_ovmap.setMap(this.map);
		// this.map.addControl(t_ovmap);
		// 添加Zomm动画
		// var t_zommAnimation = new OpenLayers.Control.LTZommAnimation();
		// t_zommAnimation.setMap(this.map);
		// this.map.addControl(t_zommAnimation);
		// 添加平移缩放条
		var t_panZoomBar = new OpenLayers.Control.PanZoomBar({
					position : new OpenLayers.Pixel(2, 15)
				});
		t_panZoomBar.setMap(this.map);
		this.map.addControl(t_panZoomBar);
		// 添加导航
		var t_navigation = new OpenLayers.Control.Navigation();
		t_navigation.setMap(this.map);
		this.map.addControl(t_navigation);
	},
	addSystemCommands_normal : function() {
		// 添加鼠标点
		var t_mouseposition = new OpenLayers.Control.MousePosition();
		t_mouseposition.setMap(this.map);
		this.map.addControl(t_mouseposition);
		// 添加Zomm动画
		// var t_zommAnimation = new OpenLayers.Control.LTZommAnimation();
		// t_zommAnimation.setMap(this.map);
		// this.map.addControl(t_zommAnimation);
	},
	// 添加测量命令 控件
	addMeasureCommands : function() {
		// 测量控制操作
		var sketchSymbolizers = {
			"Point" : {
				graphicName : "cross",
				graphicHeight : 8,
				graphicWidth : 8,
				fillColor : "#FF0000",
				fillOpacity : 1,
				strokeWidth : 0
			},
			"Line" : {
				strokeWidth : 1.5,
				strokeOpacity : 1,
				strokeColor : "#0000FF"
			},
			"Polygon" : {
				strokeWidth : 1.5,
				strokeOpacity : 1,
				strokeColor : "#0000FF",
				fillColor : "#ccccff",
				fillOpacity : 0.3
			}
		};

		var style = new OpenLayers.Style();
		style.addRules([new OpenLayers.Rule({
					symbolizer : sketchSymbolizers
				})]);
		var styleMap = new OpenLayers.StyleMap({
					"default" : style
				});

		var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
		renderer = (renderer)
				? [renderer]
				: OpenLayers.Layer.Vector.prototype.renderers;

		var options = {
			persist : true,
			handlerOptions : {
				style : "default",
				layerOptions : {
					renderers : renderer,
					styleMap : styleMap
				}
			}
		};
		// 线，面测量
		measureControls = {
			line : new OpenLayers.Control.Measure(OpenLayers.Handler.Path,
					options),
			polygon : new OpenLayers.Control.Measure(
					OpenLayers.Handler.Polygon, options)
		};

		var control;
		var self = this;
		for (var key in measureControls) {
			control = measureControls[key];
			control.events.on({
				"measure" : this.handleMeasure, // 测量距离完成的时候
				"measurepartial" : this.handleMeasurePartial
					// 测量距离加入一个点的时候
				});
			this.map.addControl(control);
			this.LayerList.add(control);
		}
	},
	// 添加绘制要素的命令 点，线，面
	addDrawFeatureCommands : function() {
		this.vlayer_drawFeature = new OpenLayers.Layer.Vector();
		this.map.addLayer(vlayer_drawFeature);
		drawControls = {
			point : new OpenLayers.Control.DrawFeature(this.vlayer_drawFeature,
					OpenLayers.Handler.Point),
			line : new OpenLayers.Control.DrawFeature(this.vlayer_drawFeature,
					OpenLayers.Handler.Path),
			polygon : new OpenLayers.Control.DrawFeature(
					this.vlayer_drawFeature, OpenLayers.Handler.Polygon)
		};
		for (var key in drawControls) {
			this.map.addControl(drawControls[key]);
			this.LayerList.add(drawControls[key]);
		}
	},
	// 添加面板
	addPanel : function() {
		var panel = new OpenLayers.Control.Panel();
		this.map.addControls(panel);
		addPanelControls = {
			zoomBox : new OpenLayers.Control.ZoomBox()
		};
		for (var key in addPanelControls) {
			this.map.addControl(addPanelControls[key]);
		}
	},
	// 缩放到要素
	zoomToFeatures : function(features) {
		if (features == null || features == 'undefined')
			return;
		var left = 0;
		var top = 0;
		var right = 0;
		var bottom = 0;
		//
		for (i = 0; i < features.length; i++) {
			var fea = features[i];
			if (fea.geometry != null) {
				var geoBound = fea.geometry.getBounds();
				if (geoBound.left < left || left == 0)
					left = geoBound.left;
				if (geoBound.top > top || top == 0)
					top = geoBound.top;
				if (geoBound.right > right || right == 0)
					right = geoBound.right;
				if (geoBound.bottom < bottom || bottom == 0)
					bottom = geoBound.bottom;
			}
		}
		var zoomBounds = new OpenLayers.Bounds(left, bottom, right, top);

		this.map.zoomTo(7);
		var t_LLpoint = this.getFeatureCenterLonLat(features[0]);
		this.map.panTo(t_LLpoint);
	},
	// ////////////////////////
	// 统一获取要素中心点函数//
	// ////////////////////////
	getFeatureCenterLonLat : function(fea) {
		if (fea == null || fea == 'undefined') {
			return null;
		}
		var bound = fea.geometry.getBounds();
		var lon = (parseFloat(bound.right) - parseFloat(bound.left)) / 2
				+ parseFloat(bound.left);
		var lat = (parseFloat(bound.top) - parseFloat(bound.bottom)) / 2
				+ parseFloat(bound.bottom);
		var lonlat = new OpenLayers.LonLat(lon, lat);
		return lonlat;
	},
	// 长度单位、面积单位汉化
	UnitsToCHS : function(units) {
		var unitsCHS = units;
		switch (units.toLowerCase()) {
			case "m" :
				unitsCHS = "米";
				break;
			case "km" :
				unitsCHS = "千米";
				break;
		}
		return unitsCHS;
	},
	// 当前正在执行的工具
	getCurrentTool : function() {
		return m_CurrentTool;
	},
	setCurrentTool : function(p_tool) {
		if (m_CurrentTool != null) {
			try {
				m_CurrentTool.deactivate();
			} catch (e) {
			}
		}
		m_CurrentTool = p_tool;
		try {
			m_CurrentTool.activate();
		} catch (e) {
		}
	},
	getImg : function(bounds) {
		var x = Math.round(Math.pow(2, this.map.getZoom())
				* (bounds.left + 180) / 360);
		x = Math.round(x);
		var y = Math
				.round(Math.pow(2, this.map.getZoom() - 1) * (90 - bounds.top)
						/ 180 + Math.pow(2, this.map.getZoom() - 2));
		var z = this.map.getZoom();
		var imgUrl = "http://wufeluli/map/googlemaps/roadmap/" + z + "/" + x
				+ "/" + y + ".png";
		return imgUrl;
	}
});